package com.kevin.utils;

import com.kevin.model.Location;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * @author kevin
 * @version V1.0
 * @Description: TODO
 * @date 2019/1/30 16:29
 **/
public class DistanceUtil {
    /**
     *  角度转换成弧度
     */
    private static double rad(double d) {
        return d * Math.PI / 180.00;
    }

    /**
     * 根据经纬度计算两点之间的距离（单位米）
     */
    public static String algorithm(double longitude1, double latitude1, double longitude2, double latitude2) {
        //纬度1
        double Lat1 = rad(latitude1);
        //纬度2
        double Lat2 = rad(latitude2);
        //两点纬度之差
        double a = Lat1 - Lat2;
        //经度之差
        double b = rad(longitude1) - rad(longitude2);
        //计算两点距离的公式
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(Lat1) * Math.cos(Lat2) * Math.pow(Math.sin(b / 2), 2)));
        //弧长乘地球半径（半径为米）
        s = s * 6378137.0;
        //精确距离的数值 单位米
        s = Math.round(s * 10000d) / 10000d;
        //四舍五入 保留一位小数
        DecimalFormat df = new DecimalFormat("#.00000000");

        return df.format(s);

    }

    /**
     * 根据经纬度计算两点之间的距离（单位米）
     *
     * @return
     */
    public static double algorithmDouble(double longitude1, double latitude1, double longitude2, double latitude2){
        String dis = algorithm(longitude1, latitude1, longitude2, latitude2);

        return Double.valueOf(dis);
    }

    /**
     * 根据经纬度计算两点之间的距离（单位米）
     *
     * @param one
     * @param two
     * @return
     */
    public static double algorithm(Location one, Location two){
        String dis = algorithm(one.getLon(),one.getLat(),two.getLon(),two.getLat());

        return Double.valueOf(dis);
    }

    /**
     * 根据经纬度计算两点之间的距离（单位米）
     *
     * @param one
     * @param two
     * @return
     */
    public static String  algorithmStr(Location one, Location two){
        String dis = algorithm(one.getLon(),one.getLat(),two.getLon(),two.getLat());

        return dis;
    }

    /**
     * 根据经纬度计算两点之间的距离（单位米）
     *
     * @param one
     * @param two
     * @return
     */
    public static BigDecimal algorithmBig(Location one, Location two){
        String dis = algorithm(one.getLon(),one.getLat(),two.getLon(),two.getLat());

        return new BigDecimal(dis);
    }

}
